------------------------------------------------ | HOW TO CREATE DARK FORCES MISSION GOALS | | by Jereth Kok (kokj4m@stmichaels.vic.edu.au) | ------------------------------------------------ Acknowledgements: ----------------- LucasArts Entertainment Company -- creators of Dark Forces Yves Borckmans -- creator of DFUSE Ben & Pat McBride -- makers of the DFUSE tutorials Anyone else who I haven't mentioned and believe that they have made a significant contribution to the world of Dark Forces editing! G'day, fellow Dark Forces editors! This file (DFGOALS.TXT) contains a full explanation on how to create mission goals in Dark Forces. The demo (GOALS.EXE) gives a demonstration on how to create simple object and trigger goals as well as tracking devices, sequence charges and the ALL NEW BOSS GOALS!!! Remember to put the SECBASE.* files in your DARK directory. Take a look at SECBASE.INF and SECBASE.GOL which are relevant for making mission goals. I assume that anyone reading this file or using the demo already has managed to obtain Yves Borckman's DFUSE program. You will need LEVMAP, a .LEV and .O file editor which is a part of DFUSE. CONTENTS -------- 1. Goal overview 2. The GOL file 3. Object goals 4. Trigger goals 5. Multiple goals 6. Tracking device and sequence charges 7. Boss goals 1. GOAL OVERVIEW ---------------- A mission goal is quite self explanatory. Each Dark Forces level has mission goals, or objectives, that must be completed. Once all of the objectives in a level, are complete you will be allowed to press ESC and move on to the next level. Okay, here's the suprise. I'll bet that most people reading this believes that mission completion is controlled by the .GOL file. Incorrect! Mission completion is controlled in the .INF file! So you'd have better read my .INF file explanation (INFFILE.TXT) if you want to fully understand how to make mission goals! What the GOL file does, is control the objective screen of your Personal Data Assistant (PDA), accessed by pressing F1 while in the game. A "message: [stop] [sector name] complete [num]" that is sent from a trigger goal to a goal completion elevator (usually a dummy sector - inaccessible to the player) will fire the goal in the GOL file that is specified by the "[num]". This will cause your PDA to show that the goal has been completed. Goal objects will cause this to happen through their logics. So all that the GOL file does is displays when goals have been done, NOT allow mission completion. Unfortunately, however, the PDA is contained in a LFD (cutscene) file, the format of which is as yet unknown. So therefore, home made levels which have totally new mission objectives will not alter the PDA. The PDA will still show the goals of the original level that is being replaced. So therefore, until the LFD files become understood, which is very unlikely, I think that editing the GOL file is not essential to a home made level. The .INF file, on the other hand, is what will allow you to continue on to the next mission once you have completed all of the mission goals. Also, assuming that you haven't edited the TEXT.MSG file, the .INF file will also cause the messages - "Mission Objectives Complete" "Press Key to End Mission" - to be displayed when you have completed all of the mission goals. 2. THE GOL FILE --------------- I'll include this explanation of the GOL file in the unlikely event that the LFD files will become understood and editable. This is what will be seen for an object goal: GOAL: # ITEM: [num] And an explanation of this: GOAL: # -- This is the number of the goal starting from 0 and ascending in whole numbers. It corresponds with the objective display in the PDA. ITEM: [num] -- This corresponds with a goal object. Here are the possible goal objects and their num: Object - Num - IDPLANS.WAX 0 IPHRIK.FME 1 INAVA.WAX 2 IDATA.FME 4 IDTGUN.FME 5 IPILE.FME 6 As mentioned before, the logics of the above goal objects will fire the appropriate ITEM: [num] to show in the PDA that the goal object has been taken. This is what will be seen for a trigger goal: GOAL: # TRIG: [num] And an explanation of this: GOAL: # -- Same as for object goals. TRIG: [num] -- This corresponds with a trigger goal. The trigger should have a "message: [completion elevator] complete [num]". This message will fire the TRIG: [num] to show in the PDA that the goal trigger has been triggered. 3. OBJECT GOALS --------------- Goal objects are objects that can be used as mission objectives. These are the possible objects that can be used as goals: IDPLANS.WAX (Death Star Plans) IPHRIK.FME (Phrik metal) INAVA.WAX (Nava Card) IDTGUN.FME (Broken Dark Trooper weapon) IDATA.FME (Data tapes) IPILE.FME (Your gear) This is how to make obtaining one of these objects into a mission goal: Enter Levmap. Add one of these objects to a sector in your level (select an existing object, move to the desired position and press Insert). Then edit the object (Enter) and change it to one of the above frames or sprites. The next step is VERY important - press S to change the logic of the copied object to the logic of the new object. This is important because, as mentioned above, the logics of these goal objects will fire the ITEM: [num] in the GOL file. But in addition, the logics of these objects will also cause an elevator called "complete" to move to its next stop. Therefore, by giving this elevator "stop: [value] complete" at stop 1, mission completion will occur when the object has been picked up. Now you need the completion elevator. Create a dummy sector (inaccessible to the player) in Levmap. It HAS to be called "complete". Now edit the INF file of the level, add one to "ITEMS #" and add this item: item: sector name: complete seq class: elevator move_floor event_mask: 0 speed: 0 stop: 0 hold stop: 1 complete seqend 4. TRIGGER GOALS ---------------- To make a trigger goal, you will need the following in the trigger's sequence (in the INF file, of course). message: [completion elevator name] complete [num] Now create a completion elevator exactly the same as with goal objects, only this time it does not need to called "complete". item: sector name: [completion elevator name] seq class: elevator move_floor event_mask: 0 speed: 0 stop: 0 hold stop: 1 complete seqend The "complete [num]" message sent from the trigger will move this elevator to its next stop, but will also fire the TRIG: [num] in the GOL file to show in the PDA that the trigger goal has been triggered. Once again, this is useless since LFD files can't be edited. 5. MULTIPLE GOALS ----------------- A level would be pretty boring with only one mission goal! Multiple goals require the use of a dummy elevator for each goal and another dummy elevator which is the completion elevator and is activated by each of the other dummy elevators. 5a. Multiple goals in any order ------------------------------- To create a level with more than one goal that can be done in any order, you need a dummy elevator for each trigger goal and one for all goal objects. The trigger's clients should be their dummy elevator. The dummy elevator for goal objects needs to be called "complete", of course. Just make sure that "complete" will only reach its final stop when all the goal objects have been picked up. This means that "complete" needs to have 1 more stop than there are goal objects. All stops should be "hold". At the final stop a message is sent to a completion elevator telling it to move to its next stop. The dummy elevators for trigger goals should have 3 stops each. They should hold at stop 0, stay at stop 1 for a short period of time and terminate at stop 2. They have to send a "complete" message from stop 1 to the completion elevator. The completion elevator needs to have its initial stop (stop 0) plus a stop for each of the other dummy elevators. Its final stop should be a "complete" stop. Here's an example of the mission completion elevators in the INF file where there are 2 goal objects and 2 trigger goals. All can be done in any order. /* This is the dummy elevator for the object goals */ item: sector name: complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 hold stop: 2 hold message: 2 all_complete next_stop speed: 0 seqend /* This is the client dummy elevator of one of the trigger goals */ item: sector name: dummy1 seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 0 message: 1 all_complete complete [num] stop: 2 terminate speed: 0 seqend /* This is the client dummy elevator of the other trigger goal. */ item: sector name: dummy2 seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 0 message: 1 all_complete complete [num] stop: 2 terminate speed: 0 seqend /* This is the completion elevator */ item: sector name: all_complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 hold stop: 2 hold stop: 3 complete speed: 0 seqend 5b. Sequential goals -------------------- It gets more complicated if you want goals that can only be done in a particular order. For example, you might need to get the Death Star Plans before reaching your landing pad. What this involves is the use of the master variable. Completing one goal would turn on the master of an elevator which would enable another goal to be completed and so on. Here is the above example again, but this time the goals have to be completed in this order - object, object, trigger, trigger. /* This is the dummy elevator for the object goals */ item: sector name: complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 hold stop: 2 hold message: 2 all_complete next_stop message: 2 dummy1 master_on speed: 0 seqend /* This is the client dummy elevator of the first trigger goal. Its master*/ /* is initially off, but is turned on when both objects have been picked up.*/ item: sector name: dummy1 seq class: elevator move_floor master: off event_mask: 0 stop: 0 hold stop: 1 0 message: 1 all_complete complete [num] message: 1 dummy2 master_on stop: 2 terminate speed: 0 seqend /* This is the client dummy elevator of the second trigger goal. Its master*/ /* is initially off, but is turned on when the first trigger goal has been*/ /* triggered. */ item: sector name: dummy2 seq class: elevator move_floor master: off event_mask: 0 stop: 0 hold stop: 1 0 message: 1 all_complete complete [num] stop: 2 terminate speed: 0 seqend /* This is the completion elevator. */ item: sector name: all_complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 hold stop: 2 hold stop: 3 complete speed: 0 seqend 6. TRACKING DEVICE AND SEQUENCER CHARGES ---------------------------------------- These are two special cases of trigger goals. Here's how to make them... 6a. Tracking device ------------------- This is found in Ramses Hed (original level 7). This is what happens: the line with the tracking device texture is in a small alcove sector. This sector is an elevator scroll_wall, and also a trigger. The trigger is operated by nudging from the outside, and causes a dummy elevator to move to its next stop. At its next stop, the dummy elevator moves the sector with the tracking device texture (elevator scroll_wall) to its next stop at speed: 0 (instantaneous). At this stop, the dummy sector also moves another dummy elevator to a complete stop. The wall with the tracking device texture has flag 1 bit 128 (allow scroll mid tx), so it will scroll instantaneously to a point which looks the same as it was before, but with the little blue thing on it so it looks as if Kyle has placed a tracking device on it. Here's how to create this same effect in your level: Firstly, in Levmap, create a small rectangular sector with height 8. Two sides should have a width of 8 and the other two sides should have a very small width (1 or 2). Adjoin this to the desired sector so it is an alcove at Kyle's eye level. Call this sector "track_dev". Place texture IATRKDEV.BM on the wall opposite the wall with the adjoin. Give this wall flag 1 bit 128 (allow scroll mid tx). Add 2 dummy sectors and call them "dummy" and "complete". Now add the following to the INF file of the level (add 3 to "items #"). item: sector name: track_dev seq class: trigger event_mask: 32 client: dummy message: complete [num] class: elevator scroll_wall event_mask: 0 speed: 0 angle: 180 stop: 0 hold stop: 64 terminate seqend item: sector name: dummy seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 0 message: 1 track_dev next_stop message: 1 complete next_stop stop: 2 terminate speed: 0 seqend item: sector name: complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 complete speed: 0 seqend 6b. Sequencer charges --------------------- These are found in the Gromas Mines, Robotics Facility and Arc Hammer (levels 5, 8 and 14). The concept is the same as the tracking device. Note that the elevator scroll_wall has 3 stops in this case. Once you nudge the alcove sector, the sequencer charge texture scrolls between 2 stops. Here's what to do: Firstly, in Levmap, create a small rectangular sector with height 8. Two sides should have a width of 8 and the other two sides should have a very small width (1 or 2). Adjoin this to the desired sector so it is an alcove at Kyle's eye level. Call this sector "seq_charge". Place texture IWASEQUE.BM on the wall opposite the wall with the adjoin. Give this wall flag 1 bit 128 (allow scroll mid tx). Add a dummy sector and call it "dummy". Add another dummy sector and call it "charge_set". Add one more dummy sector and call it "complete". Now add the following to the INF file of the level (add 4 to "items #"). item: sector name: seq_charge seq class: trigger event_mask: 32 client: dummy message: complete [num] class: elevator scroll_wall event_mask: 0 speed: 0 angle: 0 stop: 192 hold stop: 128 hold stop: 64 hold seqend item: sector name: dummy seq class: elevator move_floor event_mask: 0 speed: 0 stop: 0 hold stop: 1 0 message: 1 charge_set master_on message: 1 complete next_stop stop: 2 terminate seqend item: sector name: charge_set seq class: elevator move_floor event_mask: 0 master: off speed: 0 stop: 0 0.5 message: 0 seq_charge goto_stop 1 stop: 1 0.5 message: 1 seq_charge goto_stop 2 seqend item: sector name: complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 complete speed: 0 seqend 7. BOSS GOALS ------------- This is actually a little invention of mine (Sorry if someone else has come up with this idea too!) - it's not used in any of the original levels. A boss goal is an objective completed by killing an enemy. This could be very handy in a "Terminate Boba Fett" or "Terminate General Mohc" level! The following can be used as boss goals: BOBAFETT.WAX (What do you think?!?) KELL.WAX (Kell dragon) PHASE1.WAX (Phase 1 Dark Trooper) PHASE2.WAX (Phase 2 Dark Trooper) PHASE3X.WAX (Mohc) The principle behind this is similar to goal objects like the Death Star Plans. A certain element in the sequence of one of these objects will cause an elevator called "boss", (or "mohc" in the case of PHASE3X.WAX) to move to its next stop. This is what you need to do to turn one of these sprites into a mission objective: Edit the .O file of the level and find the sprite that you want to kill in order to complete the mission. Add this to its sequence (the stuff between "Seq" and "Seqend"): BOSS: TRUE Now edit your level with Levmap. Add a dummy sector called "boss" if your boss goal is Boba Fett, a Kell dragon, a Phase 1 Dark Trooper or a Phase 2 Dark Trooper. If the boss goal is Mohc, call the dummy sector "mohc". Add another dummy sector and call it "complete". Add this to the INF file of the level (add 2 to "items #"): item: sector name: boss/mohc seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 hold message: 1 complete complete [num] speed: 0 seqend item: sector name: complete seq class: elevator move_floor event_mask: 0 stop: 0 hold stop: 1 complete speed: 0 seqend Well, that's all folks! If you have anything to add to this file, if you want to correct something I have wrong, or if you just want to comment or ask a question, mail me at kokj4m@stmichaels.vic.edu.au Any additions, or corrections will be put in an updated version of this file. Include your name so that I can credit you. Please distribute this file like crazy! Upload it on bulletin boards and Internet pages! Until next time, Happy Dark Forces level making!